package Fachada;

import classes.Categoria;
import classes.Entrada;
import classes.Fornecedor;
import classes.ItensProduto;
import classes.Produto;
import classes.Saida;
import classes.Unidade;
import classes.Usuario;
import controlador.ControladorCategoria;
import controlador.ControladorEntrada;
import controlador.ControladorFornecedor;
import controlador.ControladorProduto;
import controlador.ControladorSaida;
import controlador.ControladorUnidade;
import controlador.ControladorUsuario;
import erro.ConexaoException;
import erro.ConsultaException;
import erro.DaoException;
import erro.GeralException;
import java.sql.SQLException;
import java.util.ArrayList;
import javax.swing.JOptionPane;

/**
 *
 * @author George
 */
public class Fachada {

    private static Fachada instancia;
    private ControladorUsuario usucontrol;
    private ControladorCategoria catcontrol;
    private ControladorProduto prodcontrol;
    private ControladorUnidade unicontrol;
    private ControladorFornecedor forneccontrol;
    private ControladorEntrada entcontrol;
    private ControladorSaida saidacontrol;

    /**
     * Construtor privado para evitar geração de novas instancias fora da classe
     */
    private Fachada() {
        usucontrol = new ControladorUsuario();
        catcontrol = new ControladorCategoria();
        prodcontrol = new ControladorProduto();
        forneccontrol = new ControladorFornecedor();
        unicontrol = new ControladorUnidade();
        entcontrol = new ControladorEntrada();
        saidacontrol = new ControladorSaida();
    }

    /**
     * Retorna a instancia da fachada(singleton)
     *
     * @return
     */
    public static Fachada getInstancia() {
        if (instancia == null) {
            instancia = new Fachada();
        }
        return instancia;
    }

    /**
     * Insere novos usuários nmo banco de Dados
     *
     * @param usu
     * @throws ConsultaException
     * @throws ConexaoException
     * @throws GeralException
     * @throws SQLException
     */
    public void inserirUsu(Usuario usu) throws ConsultaException, ConexaoException, GeralException, SQLException {
        this.usucontrol.verificar(usu);
        this.usucontrol.validar(usu);
        this.usucontrol.inserir(usu);
        JOptionPane.showMessageDialog(null, "Usuário Cadastrado com Sucesso!");
    }

    /**
     * Altera as innformações de usuários cadstrados no Banco de Dados.
     *
     * @param usu
     * @throws ConsultaException
     * @throws ConexaoException
     * @throws GeralException
     */
    public void alterarUsu(Usuario usu) throws ConsultaException, ConexaoException, GeralException {
        this.usucontrol.validar(usu);
        this.usucontrol.alterar(usu);
        JOptionPane.showMessageDialog(null, "Usuário Alterado com Sucesso!");
    }

    /**
     * Exclui usuários cadastrados no Banco de Dados.
     *
     * @param usu
     * @throws ConsultaException
     * @throws ConexaoException
     * @throws GeralException
     */
    public void deletarUsu(Usuario usu) throws ConsultaException, ConexaoException, GeralException {
        this.usucontrol.deletar(usu);
        JOptionPane.showMessageDialog(null, "Usuário Deletado com Sucesso!");
    }

    /**
     * Pesquisa Usuários no Banco de Dados.
     *
     * @param usu
     * @throws ConsultaException
     * @throws ConexaoException
     * @throws GeralException
     * @throws DaoException
     */
    public void pesquisarUsu(Usuario usu) throws ConsultaException, ConexaoException, GeralException, DaoException {
        //this.usucontrol.validarCPF(usu);
        this.usucontrol.pesquisarUsuario(usu);
    }

    /**
     * Pesquisa o login do Usuário no Banco de Dados.
     *
     * @param usu
     * @return
     * @throws ConexaoException
     * @throws DaoException
     */
    public Usuario pesquisarLogin(Usuario usu) throws ConexaoException, DaoException {
        return (Usuario) this.usucontrol.pesquisarLogin(usu);
    }

    /**
     * Pesquisa Usuários no Banco de Dados.
     *
     * @param usu
     * @return
     * @throws ConexaoException
     * @throws ConsultaException
     */
    public ArrayList<Usuario> pesquisarUsuario(Usuario usu) throws ConexaoException, ConsultaException {
        return this.usucontrol.pesquisarUsuarioUsu(usu);
    }

    /**
     * retorna uma lista de Usuários do Banco de Dados.
     *
     * @param usu
     * @return
     * @throws ConexaoException
     * @throws ConsultaException
     */
    public ArrayList<Usuario> listar(Usuario usu) throws ConexaoException, ConsultaException {
        return this.usucontrol.listar(usu);
    }

    /**
     * Insere novas categorias no BD
     *
     * @param cat
     * @throws ConsultaException
     * @throws ConexaoException
     * @throws GeralException
     * @throws SQLException
     */
    public void inserirCat(Categoria cat) throws ConsultaException, ConexaoException, GeralException, SQLException {
        this.catcontrol.validar(cat);
        this.catcontrol.inserir(cat);
        JOptionPane.showMessageDialog(null, "Categoria Cadastrada com Sucesso!");
    }

    /**
     * Altera uma Categoria existente no BD
     *
     * @param cat
     * @throws ConsultaException
     * @throws ConexaoException
     * @throws GeralException
     */
    public void alterarCat(Categoria cat) throws ConsultaException, ConexaoException, GeralException {
        this.catcontrol.validar(cat);
        this.catcontrol.alterar(cat);
        JOptionPane.showMessageDialog(null, "Categoria Alterada com Sucesso!");
    }

    /**
     * Deleta uma categoria existente no BD
     *
     * @param cat
     * @throws ConsultaException
     * @throws ConexaoException
     * @throws GeralException
     */
    public void deletarCat(Categoria cat) throws ConsultaException, ConexaoException, GeralException {
        this.catcontrol.deletar(cat);
        JOptionPane.showMessageDialog(null, "Categoria Deletada com Sucesso!");
    }

    /**
     * Pesquisa Categorias e valida os campos no BD.
     *
     * @param cat
     * @throws ConexaoException
     * @throws GeralException
     * @throws DaoException
     */
    public void pesquisarCateg(Categoria cat) throws ConexaoException, GeralException, DaoException {
        this.catcontrol.validar(cat);
        this.catcontrol.pesquisarCategoria(cat);
    }

    /**
     * Pesquisa categorias no BD
     *
     * @param cat
     * @return
     * @throws ConsultaException
     * @throws ConexaoException
     */
    public ArrayList<Categoria> pesquisarCat(Categoria cat) throws ConsultaException, ConexaoException {
        return this.catcontrol.pesquisarCategoriaCat(cat);
    }

    /**
     * Retorna um alista de categorias existentes no BD.
     *
     * @param cat
     * @return
     * @throws ConexaoException
     * @throws ConsultaException
     */
    public ArrayList<Categoria> listar(Categoria cat) throws ConexaoException, ConsultaException {
        return this.catcontrol.listar(cat);
    }

    /**
     * Insere nosvos produtos no BD.
     *
     * @param prod
     * @throws ConsultaException
     * @throws ConexaoException
     * @throws GeralException
     * @throws SQLException
     */
    public void inserirProd(Produto prod) throws ConsultaException, ConexaoException, GeralException, SQLException {
        this.prodcontrol.validar(prod);
        this.prodcontrol.inserir(prod);
        JOptionPane.showMessageDialog(null, "Produto Cadastrado com Sucesso!");
    }

    /**
     * Altera registro de Produtos no BD.
     *
     * @param prod
     * @throws ConsultaException
     * @throws ConexaoException
     * @throws GeralException
     */
    public void alterarProd(Produto prod) throws ConsultaException, ConexaoException, GeralException {
        this.prodcontrol.validar(prod);
        this.prodcontrol.alterar(prod);
        JOptionPane.showMessageDialog(null, "Produto Alterado com Sucesso!");
    }

    /**
     * Deleta registros de produtos no BD.
     *
     * @param prod
     * @throws ConsultaException
     * @throws ConexaoException
     * @throws GeralException
     */
    public void deletarProd(Produto prod) throws ConsultaException, ConexaoException, GeralException {
        this.prodcontrol.deletar(prod);
        JOptionPane.showMessageDialog(null, "Produto Deletado com Sucesso!");
    }

    /**
     * Pesquisa e valida registros de produtos no BD.
     *
     * @param prod
     * @throws GeralException
     * @throws DaoException
     */
    public void pesquisarProd(Produto prod) throws GeralException, DaoException {
        this.prodcontrol.validar(prod);
        this.prodcontrol.pesquisarProduto(prod);
    }

    /**
     * Pesquisa
     *
     * @param prod
     * @return
     * @throws ConexaoException
     * @throws ConsultaException
     */
    public ArrayList<Produto> pesquisarProduto(Produto prod) throws ConexaoException, ConsultaException {
        return this.prodcontrol.pesquisarProdutoProd(prod);
    }

    /**
     * Lista registros de produtos existentes no Banco de dados
     *
     * @param prod
     * @return
     * @throws ConexaoException
     * @throws ConsultaException
     */
    public ArrayList<Produto> listar(Produto prod) throws ConexaoException, ConsultaException {
        return this.prodcontrol.listar(prod);
    }

    /**
     * Insere registros de fornecedores no BD
     *
     * @param fornec
     * @throws ConsultaException
     * @throws ConexaoException
     * @throws GeralException
     * @throws SQLException
     */
    public void inserirFornec(Fornecedor fornec) throws ConsultaException, ConexaoException, GeralException, SQLException {
        this.forneccontrol.validar(fornec);
        this.forneccontrol.inserir(fornec);
        JOptionPane.showMessageDialog(null, "Fornecedor Cadastrado com Sucesso!");
    }

    /**
     * Altera registros de fonecedores no BD.
     *
     * @param fornec
     * @throws ConsultaException
     * @throws ConexaoException
     * @throws GeralException
     */
    public void alterarFornec(Fornecedor fornec) throws ConsultaException, ConexaoException, GeralException {
        this.forneccontrol.validar(fornec);
        this.forneccontrol.alterar(fornec);
        JOptionPane.showMessageDialog(null, "Fornecedor Alterado com Sucesso!");
    }

    /**
     * Deleta Registros de Fornecedores de BD
     *
     * @param fornec
     * @throws ConsultaException
     * @throws ConexaoException
     * @throws GeralException
     */
    public void deletarFornec(Fornecedor fornec) throws ConsultaException, ConexaoException, GeralException {
        this.forneccontrol.deletar(fornec);
        JOptionPane.showMessageDialog(null, "Fornecedor Deletado com Sucesso!");
    }

    /**
     * PEsquisa e valida registros existentes no BD
     *
     * @param fornec
     * @throws GeralException
     * @throws DaoException
     */
    public void pesquisarFornec(Fornecedor fornec) throws GeralException, DaoException {
        this.forneccontrol.validarCNPJ(fornec);
        this.forneccontrol.pesquisarFornecedor(fornec);
    }

    /**
     * Pesquisa e retorna registros de funcionarios no BD
     *
     * @param fornec
     * @return
     * @throws ConexaoException
     * @throws ConsultaException
     */
    public ArrayList<Fornecedor> pesquisarFornecedor(Fornecedor fornec) throws ConexaoException, ConsultaException {
        return this.forneccontrol.pesquisarFornecedorFornec(fornec);
    }

    /**
     * Retorna uma lista de fornecedores existent4es no BD.
     *
     * @param fornec
     * @return
     * @throws ConexaoException
     * @throws ConsultaException
     */
    public ArrayList<Fornecedor> listar(Fornecedor fornec) throws ConexaoException, ConsultaException {
        return this.forneccontrol.listar(fornec);
    }

    /**
     * Insere registros de Unidade de medida no BD
     *
     * @param uni
     * @throws ConsultaException
     * @throws ConexaoException
     * @throws GeralException
     * @throws SQLException
     */
    public void inserirUni(Unidade uni) throws ConsultaException, ConexaoException, GeralException, SQLException {
        this.unicontrol.validar(uni);
        this.unicontrol.inserir(uni);
        JOptionPane.showMessageDialog(null, "Unidade Cadastrada com Sucesso!");
    }

    /**
     * Altera registros de Unidade de medida no BD
     *
     * @param uni
     * @throws ConsultaException
     * @throws ConexaoException
     * @throws GeralException
     */
    public void alterarUni(Unidade uni) throws ConsultaException, ConexaoException, GeralException {
        this.unicontrol.validar(uni);
        this.unicontrol.alterar(uni);
        JOptionPane.showMessageDialog(null, "Unidade Alterada com Sucesso!");
    }

    /**
     * Deleta registros de Unidade de medida no BD
     *
     * @param uni
     * @throws ConsultaException
     * @throws ConexaoException
     * @throws GeralException
     */
    public void deletarUni(Unidade uni) throws ConsultaException, ConexaoException, GeralException {
        this.unicontrol.deletar(uni);
        JOptionPane.showMessageDialog(null, "Unidade Deletada com Sucesso!");
    }

    /**
     * Pesquisa e retorna registros de Unidade de medida no BD
     *
     * @param uni
     * @throws GeralException
     * @throws DaoException
     */
    public void pesquisarUnid(Unidade uni) throws GeralException, DaoException {
        this.unicontrol.validar(uni);
        this.unicontrol.pesquisarUnidade(uni);
    }

    /**
     * Pesquisa registros de Unidade de medida no BD
     *
     * @param uni
     * @return
     * @throws ConsultaException
     * @throws ConexaoException
     */
    public ArrayList<Unidade> pesquisarUni(Unidade uni) throws ConsultaException, ConexaoException {
        return this.unicontrol.pesquisarUnidadeUni(uni);
    }

    /**
     * retorna uma registros de Unidade de medida no BD
     *
     * @param uni
     * @return
     * @throws ConexaoException
     * @throws ConsultaException
     */
    public ArrayList<Unidade> listar(Unidade uni) throws ConexaoException, ConsultaException {
        return this.unicontrol.listar(uni);
    }

    //*****ENTRADA*****
    
    public void inserirEnt(Entrada ent, ItensProduto it, Produto prod) throws ConsultaException, ConexaoException, GeralException, DaoException {
        this.entcontrol.inserir(ent, it, prod);
        JOptionPane.showMessageDialog(null, "Entrada do Produto Realizada com Sucesso!");
    }
    
     public void deletarEnt(Entrada ent, Produto prod) throws ConsultaException, ConexaoException, GeralException {
        this.entcontrol.deletar(ent, prod);
        JOptionPane.showMessageDialog(null, "Entrada Deletada com Sucesso!");
    }
    
     public void pesquisarIt(ItensProduto it) throws GeralException, DaoException, ConsultaException {
        this.entcontrol.pesquisarIt(it);
    }
     
     public void pesquisarEnt(Entrada ent) throws GeralException, DaoException, ConsultaException {
        this.entcontrol.pesquisarEntrada(ent);
    }
     
     public ArrayList<Entrada> pesquisarEntrada(Entrada ent) throws ConexaoException, ConsultaException {
        return this.entcontrol.pesquisarEntradaEnt(ent);
    }
     
     public ArrayList<Entrada> listarEnt(Entrada ent) throws ConexaoException, ConsultaException {
        return this.entcontrol.listarEntrada(ent);
    }
     public ArrayList<ItensProduto> listar(ItensProduto ip) throws ConexaoException, ConsultaException {
        return this.entcontrol.listar(ip);
    }
     //*****SAIDA*****
    
    public void inserirSaida(Saida saida, ItensProduto it, Produto prod) throws ConsultaException, ConexaoException, GeralException, DaoException {
        this.saidacontrol.validar(saida);
        this.saidacontrol.inserir(saida, it, prod);
        JOptionPane.showMessageDialog(null, "Saida do Produto Realizada com Sucesso!");
    }
    
     public void deletarSaida(Saida saida, ItensProduto ip, Produto prod) throws ConsultaException, ConexaoException, GeralException {
        this.saidacontrol.deletar(saida, ip, prod);
        JOptionPane.showMessageDialog(null, "Saida Deletada com Sucesso!");
    }
    
     public ArrayList<Saida> pesquisarSaida(Saida saida) throws ConexaoException, ConsultaException {
        return this.saidacontrol.pesquisarSaida(saida);
    }
     
      public ArrayList<Saida> listar(Saida saida) throws ConexaoException, ConsultaException {
        return this.saidacontrol.listarSaida(saida);
    }
}
